import { def } from './utils'
import defineReactive from './defineReactive'
import { arrayMethods } from './array'
import observe from './observe'
import Dep from './Dep'

export default class Observer {
  constructor(value) {
    this.dep = new Dep()
    // 给实例添加了__ob__属性，值是这次new的实例
    def(value, '__ob__', this, false)
    // 检查是数组还是对象
    if (Array.isArray(value)) {
      // 如果是数组，要非常强行的蛮干；将这个数组的原型，指向arrayMethods
      Object.setPrototypeOf(value, arrayMethods)
      // 让这个数组变得observe
      this.observeArray(value)
    } else {
      this.walk(value)
    }
  }
  // 遍历
  walk(value) {
    for (let k in value) {
      defineReactive(value, k)
    }
  }
  // 数组的特殊遍历
  observeArray(arr) {
    for (let i = 0, l = arr.length; i < l; i++) {
      // 逐项遍历
      observe(arr[i])
    }
  }
}
